home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stut_src / lists.c < prev    next >
Text File  |  1996-05-27  |  5KB  |  252 lines

  1. /*
  2.  * Lists.c
  3.  *
  4.  * Purpose:
  5.  * --------
  6.  * Gestion de listes
  7.  * Pour toute liste chain‚e commen‡ant par:
  8.  *     void *    next
  9.  *        int        fnct_no
  10.  *
  11.  * 18.11.94: created
  12.  */ 
  13.  
  14.     #include "!OPTIONS.H"
  15.  
  16.     #include <stdio.h>
  17.     #include <stdlib.h>
  18.     #include <string.h>
  19.  
  20. /*
  21.  * Custom Headers
  22.  */ 
  23.     #include "LISTS_PU.H"
  24.     #include "S_MALLOC.H"
  25.  
  26.  
  27. /*
  28.  * Lookup_SingleLinkList(-)
  29.  *
  30.  * 18.11.94: fplanque: Created
  31.  */
  32. void *    Lookup_SingleLinkList(
  33.                 void    *    p_Elt, 
  34.                 int        n_Fnct )
  35. {
  36.     while( p_Elt != NULL )
  37.     {    
  38.         if( ((SGLE_LINK_LIST_ELT *) p_Elt) -> pseudo_key.n_Fnct == n_Fnct )
  39.         {
  40.             break;
  41.         }
  42.  
  43.         p_Elt = ((SGLE_LINK_LIST_ELT *) p_Elt) -> p_Next;
  44.     }
  45.     
  46.     return    p_Elt;
  47. }
  48.  
  49.  
  50. /*
  51.  * Lookup_PtrInSingleLinkList(-)
  52.  *
  53.  * 25.01.95: fplanque: Created based on Lookup_SingleLinkList
  54.  */
  55. void *    Lookup_PtrInSingleLinkList(
  56.                 void    *    p_Elt, 
  57.                 void    *    ptr_sought )    /* In: pointeur … rechercher */
  58. {
  59.     while( p_Elt != NULL )
  60.     {    
  61.         if( ((SGLE_LINK_LIST_ELT *) p_Elt) -> pseudo_key.ptr == ptr_sought )
  62.         {
  63.             break;
  64.         }
  65.  
  66.         p_Elt = ((SGLE_LINK_LIST_ELT *) p_Elt) -> p_Next;
  67.     }
  68.     
  69.     return    p_Elt;
  70. }
  71.  
  72.  
  73. /*
  74.  * Get_ithEltInSingleLinkList(-)
  75.  *
  76.  * Purpose:
  77.  * --------
  78.  * Trouve un elt en fnct de son num‚ro d'ordre ds la liste
  79.  *
  80.  * History:
  81.  * --------
  82.  * 04.12.94: fplanque: Created
  83.  */
  84. void    *    Get_ithEltInSingleLinkList(     /* Out: Ptr sur elt d'index demand‚ */
  85.                 void *    pListElt_First,    /* In:  Ptr sur 1er elt */
  86.                 int        n_Index )            /* In:  No d'ordre */
  87. {
  88.     SGLE_LINK_LIST_ELT    *    pSLLE_Curr = pListElt_First;
  89.  
  90.     int    i;        /* Compteur */
  91.  
  92.     for( i=0; i < n_Index  &&  pSLLE_Curr != NULL; i++ )
  93.     {    /*
  94.          * Tant qu'on est pas arriv‚ au champ qui nous int‚resse 
  95.          * et qu'on est pas … la fin de la liste: 
  96.          * Passe au champ suivant...
  97.          */
  98.         pSLLE_Curr = pSLLE_Curr -> p_Next;
  99.     }
  100.  
  101.     return    pSLLE_Curr;        /* Ptr sur params; NULL si pas trouv‚ */
  102. }
  103.    
  104.  
  105.  
  106. /*
  107.  * Append_ToSingleLinkList(-)
  108.  *
  109.  * 29.11.94: fplanque: Created
  110.  */
  111. void    *    Append_ToSingleLinkList(        /* Out: Nouvelle fin de liste */
  112.                 void    *    pListElt_Any,        /* In:  Un elt de liste, de pref le dernier (sinon on le cherchera nous meme) ou NULL si pas encore de liste */
  113.                 void    *    pListElt_New )        /* In:  Nouvel elt */ 
  114. {
  115.     SGLE_LINK_LIST_ELT    *    pSLLE_Last    = pListElt_Any;
  116.     SGLE_LINK_LIST_ELT    *    pSLLE_New    = pListElt_New;
  117.  
  118.     if( pSLLE_Last != NULL )
  119.     {
  120.         while( pSLLE_Last -> p_Next != NULL )
  121.         {
  122.             pSLLE_Last = pSLLE_Last -> p_Next;
  123.         }    
  124.     
  125.         pSLLE_Last -> p_Next = pSLLE_New;
  126.     }
  127.  
  128.     pSLLE_New -> p_Next = NULL;
  129.     
  130.     
  131.     return    pSLLE_New;
  132. }
  133.  
  134.  
  135. /*
  136.  * Insert_InSingleLinkList(-)
  137.  *
  138.  * InsŠre en premiŠre position
  139.  *
  140.  * 25.01.95: fplanque: Created
  141.  */
  142. void    *    Insert_InSingleLinkList(        /* Out: Nouveau d‚but de liste */
  143.                 void    *    pListElt_First,    /* In:  premier elt liste ou NULL si pas encore de liste */
  144.                 void    *    pListElt_New )        /* In:  Nouvel elt */ 
  145. {
  146.     SGLE_LINK_LIST_ELT    *    pSLLE_New    = pListElt_New;
  147.  
  148.     pSLLE_New -> p_Next = pListElt_First;
  149.     
  150.     return    pSLLE_New;
  151. }
  152.  
  153.  
  154.  
  155. /*
  156.  * Duplicate_SingleLinkList(-)
  157.  *
  158.  * Purpose:
  159.  * --------
  160.  * Duplique une liste simplement chain‚e
  161.  *
  162.  * Notes:
  163.  * ------
  164.  * A n'utiliser que si les elements … copier ne contiennent pas de pointeurs
  165.  * et en particulier pas de psz car les objets point‚s ne seraient pas copi‚s.
  166.  *
  167.  * History:
  168.  * --------
  169.  * 04.12.94: fplanque: Created by using dup_fieldpar()
  170.  */
  171. void    *    Duplicate_SingleLinkList( 
  172.                 const void *    pListElt_Srce,     /* In: Ptr sur 1er elt liste source */
  173.                 size_t             size_Element )        /* In: Taille d'un ‚l‚ment */
  174. {
  175.     /*
  176.      * Pointeurs: 
  177.      */
  178.     const SGLE_LINK_LIST_ELT *        pSLLE_Srce = pListElt_Srce;    /* 1er elt de la liste destination */
  179.     SGLE_LINK_LIST_ELT *        pSLLE_FirstDest;            /* 1er elt de la liste destination */
  180.     SGLE_LINK_LIST_ELT * *    lastptr_to_next = &pSLLE_FirstDest;    /* Adr du dernier ptr sur le champ suivant */
  181.     SGLE_LINK_LIST_ELT *        pSLLE_Dest;                    /* Elt courant de la liste destination */
  182.  
  183.     /*
  184.      * Copie tous les ‚l‚ments: 
  185.      */
  186.     while( pSLLE_Srce != NULL )
  187.     {
  188.         /*
  189.          * Cr‚e nouvel ‚l‚ment; 
  190.          */
  191.         pSLLE_Dest = MALLOC( size_Element );
  192.  
  193.         /*
  194.          * Copie le contenu: 
  195.          */
  196.         memcpy( pSLLE_Dest, pSLLE_Srce, size_Element );
  197.  
  198.         /*
  199.          * Lie ce champ au pr‚c‚dent: 
  200.          */
  201.         *lastptr_to_next = pSLLE_Dest;
  202.         /*
  203.          * Nouvelle adr du dernier ptr sur champ suivant: 
  204.          */
  205.         lastptr_to_next = &(pSLLE_Dest -> p_Next);
  206.                         
  207.         /*
  208.          * Passe au champ source suivant: 
  209.          */
  210.         pSLLE_Srce = pSLLE_Srce -> p_Next;
  211.     }
  212.  
  213.     /*
  214.      * Signale fin de la liste: 
  215.      */
  216.     *lastptr_to_next = NULL;
  217.  
  218.     /*
  219.      * Retourne ptr sur nlle liste: 
  220.      */
  221.     return    pSLLE_FirstDest;
  222. }
  223.  
  224.  
  225.  
  226. /*
  227.  * Delete_SingleLinkList(-)
  228.  *
  229.  * Purpose:
  230.  * --------
  231.  * Efface 1 liste chain‚e d'‚l‚ments
  232.  *
  233.  * History:
  234.  * --------
  235.  * 04.12.94: fplanque: Created
  236.  */
  237. void    Delete_SingleLinkList( 
  238.             void *    pListElt_First )
  239. {
  240.     SGLE_LINK_LIST_ELT *    pSLLE_This = pListElt_First;
  241.     SGLE_LINK_LIST_ELT *    pSLLE_Next;
  242.     
  243.     while( pSLLE_This != NULL )
  244.     {
  245.         pSLLE_Next = pSLLE_This -> p_Next;        /* Champ suivant */
  246.  
  247.         FREE( pSLLE_This );                            /* Efface le champ courant */
  248.  
  249.         pSLLE_This = pSLLE_Next;                    /* Passe au champ suivant */
  250.     }
  251. }
  252.